package com.itheima.reggie.common;

import com.itheima.reggie.common.exception.CustomException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLIntegrityConstraintViolationException;
//在项目中自定义一个全局异常处理器，在异常处理器上加上注解 @ControllerAdvice,
// 可以通过属性annotations指定拦截哪一类的Controller方法。 并在异常处理器的方法上加上注解
// @ExceptionHandler 来指定拦截的是那一类型的异常。
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    /*
    * 指定类型异常
    * */
    //先捕获一个大异常，在向下转型一个小异常，在用其去获取消息调用方法
    @ExceptionHandler(DuplicateKeyException.class)
    public R ExceptionHandler(DuplicateKeyException ex){
        SQLIntegrityConstraintViolationException ex2=(SQLIntegrityConstraintViolationException)ex.getCause();
        //Duplicate entry:重复名字
if (ex2.getMessage().contains("Duplicate entry")){
    return R.error("用户名已存在，请重新输入");
}
        return R.error("数据输入异常，请重试");
    }



    @ExceptionHandler(CustomException.class)
    public R CustomExceptionHandler(CustomException ex){
        //将异常信息打印在控制台
        // ex.printStackTrace();
        //已日志的形式打印出
        log.error("出现了未知异常：{}",ex.toString());
        return R.error(ex.getMessage());
    }

    /*
    * 未知异常的处理
    * */
    @ExceptionHandler(Exception.class)
    public R ExceptionHandler(Exception ex){
        //将异常信息打印在控制台
       // ex.printStackTrace();
        //已日志的形式打印出
        log.error("出现了未知异常：{}",ex.toString());
        return R.error("未知异常，请联系管理员");
    }
}
